package cn.me.alphamq.nameserver.handler.cluster.masterslave;

import cn.me.alphamq.common.enumeration.EventCodeEnum;
import cn.me.alphamq.common.event.model.Event;
import cn.me.alphamq.common.msg.TcpMsg;
import cn.me.alphamq.common.event.EventBus;
import cn.me.alphamq.nameserver.event.model.cluster.ReplicationMsgEvent;
import com.alibaba.fastjson2.JSON;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 主从节点复制中的从节点的 TcpMsg 处理器，可以被所有线程共享
 *
 * @author f
 */
@ChannelHandler.Sharable
public class SlaveReplicationHandler extends SimpleChannelInboundHandler<TcpMsg> {

    private static final Logger log = LoggerFactory.getLogger(SlaveReplicationHandler.class);

    /**
     * 事件总线
     */
    private final EventBus eventBus;

    public SlaveReplicationHandler(EventBus eventBus) {
        this.eventBus = eventBus;
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TcpMsg tcpMsg) {
        // 根据 code 的不同，将 body 解析成不同的 Event 对象
        int code = tcpMsg.getCode();
        byte[] body = tcpMsg.getBody();
        Event event = null;

        if (EventCodeEnum.MASTER_START_REPLICATION_RESP.getCode() == code) {
            // 服务端同意启动复制，客户端启动定时发送心跳包的任务
            // 客户端不需要响应任何消息，如果想给客户端添加心跳机制，则可以写监听器和事件的代码
        } else if (EventCodeEnum.MASTER_REPLICATION_MSG_RESP.getCode() == code) {
            event = JSON.parseObject(body, ReplicationMsgEvent.class);
        }
        // 给事件绑定 ctx 对象
        event.setCtx(ctx);

        // 发布事件
        eventBus.publish(event);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.info("slave inactive...");
    }
}
